﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using MasterComponent;

namespace MasterVNC
{
    public class ControllerMaster
    {
        private frmMaster _Form;
        private InterfaceMaster _EnabledSlave;
        private Dictionary<string, InterfaceMaster> _SlaveList;

        /// <summary>
        /// Crea un nuovo Controller.
        /// </summary>
        public ControllerMaster()
        {
            _EnabledSlave = null;
            _SlaveList = new Dictionary<string, InterfaceMaster>();
        }

        /// <summary>
        /// La form associata al Controller.
        /// </summary>
        public frmMaster Form
        {
            set { _Form = value; }
            get { return _Form; }
        }

        /// <summary>
        /// L'indirizzo ip dello slave attivo.
        /// </summary>
        public string EnabledSlave
        {
            set
            {
                // controlla se lo slave indicato è già attivo
                if ((_EnabledSlave == null && value == null) || (_EnabledSlave != null && _EnabledSlave.IPAddress == value))
                    return;

                // disattiva lo slave attivato precendentemente
                if (_EnabledSlave != null)
                    _EnabledSlave.Deactivate();

                // controlla se si vuole disabilitare tutti gli slave
                if (value == null)
                {
                    _EnabledSlave = null;
                    _Form.ChangeScreen(null);
                    return;
                }

                // rende attivo il nuovo slave
                if (_SlaveList.ContainsKey(value))
                {
                    _SlaveList.TryGetValue(value, out _EnabledSlave);
                    _EnabledSlave.Activate();

                    // cambia lo schermo mostrato dalla form
                    _Form.ChangeScreen(this.GetWholeScreen(value)); // ToDo verificare GetWholeScreen con le funzioni dell'interfaccia
                }
            }

            get
            {
                if (_EnabledSlave != null)
                    return _EnabledSlave.IPAddress;
                else
                    return null;
            }
        }

        // FUNZIONI INTERFACCIA -> FORM
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Aggiunge un nuovo slave alla lista degli slave connessi.
        /// </summary>
        /// <param name="newSlave"></param>
        public void AddSlave(InterfaceMaster newSlave)
        {
            // chiede all'utente se vuole accettare la connessione dal nuovo slave, se non vuole chiude la connessione
            if (_Form.ShowAcceptConnection(newSlave.IPAddress))
            {
                _SlaveList.Add(newSlave.IPAddress, newSlave);
                _Form.AddSlaveItem(newSlave.IPAddress);
                newSlave.Deactivate(); // disattiva per precauzione il nuovo slave

                // se la lista degli slave è vuota imposta il nuovo slave come quello attivo
                if (_SlaveList.Count == 1)
                    this.EnabledSlave = newSlave.IPAddress;
            }
            else
            {
                newSlave.CloseConnection(); // ToDo verificare con funzioni interfaccia
            }
        }

        /// <summary>
        /// Rimuove lo slave dalla lista degli slave connessi.
        /// </summary>
        /// <param name="slave"></param>
        public void RemoveSlave(InterfaceMaster slave)
        {
            _SlaveList.Remove(slave.IPAddress);
            _Form.RemoveSlaveItem(slave.IPAddress);

            // se lo slave rimosso è quello attivo elimina la schermata
            if (_EnabledSlave.IPAddress == slave.IPAddress)
            {
                EnabledSlave = null;
            }

            // informa l'utente della disconnessione
            _Form.ShowError("La connessione con lo slave " + slave.IPAddress + " è stata interrotta.");
        }

        /// <summary>
        /// Aggiorna la schermata mostrata all'utente.
        /// </summary>
        /// <param name="slave">l'interfaccia dello slave che notifica l'update.</param>
        /// <param name="update">l'immagine contenente l'update.</param>
        /// <param name="upperLeftCorner">la posizione dell'angolo in alto a sinistra dell'immagine.</param>
        public void UpdateScreen(InterfaceMaster slave, Image update, Point upperLeftCorner)
        {
            if (slave == _EnabledSlave)
                _Form.UpdateScreen(update, upperLeftCorner);
        }

        // FUNZIONI FORM -> INTERFACCIA
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Restituisce l'intera schermata dello slave indicato dal parametro.
        /// </summary>
        /// <param name="slaveName">l'identificativo dello slave.</param>
        /// <returns></returns>
        public Image GetWholeScreen(string slaveName)
        {
            InterfaceMaster slave = new InterfaceMaster();

            if (_SlaveList.ContainsKey(slaveName))
            {
                _SlaveList.TryGetValue(slaveName, out slave);
                return slave.GetWholeScreen(); // ToDo verificare con le funzioni dell'interfaccia
            }
            else
                return null;
        }

        /// <summary>
        /// Chiude la connessione dello slave correntemente utilizzato.
        /// </summary>
        public void CloseConnection()
        {
            if (_EnabledSlave != null)
            {
                _EnabledSlave.CloseConnection();
                this.RemoveSlave(_EnabledSlave);
            }
        }

        // ToDo funzioni che gestiscono gli eventi che arrivano dalla form
    }
}
